package com.naver.xml.sax;

import java.io.IOException;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;

public class XmlSaxUtil extends DefaultHandler {
	private SAXParserFactory parserFact;
	private SAXParser parser;
	private Attributes tagAttributes;

	private String fileName;
	private String startTagName;
	private String endTagName;
	private String tagData;
	private String[] attrQNames;
	private String[] attrValues;

	private StringBuffer buffer = new StringBuffer();

	public XmlSaxUtil(String fileName) {
		super();
		try {
			parserFact = SAXParserFactory.newInstance();
			parser = parserFact.newSAXParser();

		} catch (Exception e) {
		}
		this.fileName = fileName;
	}

	public void startElement(String uri, String iName, String ele, Attributes attributes) throws SAXException {
		startTagName = ele;
		tagAttributes = attributes;

		attrQNames = new String[tagAttributes.getLength()];
		attrValues = new String[tagAttributes.getLength()];
		for (int i = 0; i < tagAttributes.getLength(); i++) {
			attrQNames[i] = tagAttributes.getQName(i).trim();
			attrValues[i] = tagAttributes.getValue(i).trim();
		}
		buffer.setLength(0);
	}

	//이 메소드는 태그의 내용을 읽으면서 발생하는 이벤트 핸들링 메소드이다.
	//예 : <tag>data</tag> 여기서, 가운데 있는 data 가 읽히면서 발생하는 이벤트
	public void characters(char[] ch, int start, int len) throws SAXException {
		buffer.append(ch, start, len); //버퍼에 data 를 집어넣기
	}

	public void endElement(String uri, String localName, String qName) {
		endTagName = qName;
		tagData = buffer.toString().trim();//end tag 가 오면 버퍼에 있는 내용을 사용
	}

	public void parse() {
		try {
			parser.parse(fileName, this);
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		XmlSaxUtil parser = new XmlSaxUtil(args[0]);

		try {
			parser.parse();
			System.out.println("parsing success");

		} catch (Exception e) {
			System.out.println("parsing error.");
			e.printStackTrace();
			System.exit(0);
		}
	}
}